From: Florian Müllner Date: Mon, 24 Jan 2011 22:15:33 +0000 (+0100) Subject: swipe-scrolling: Take threshold into account during drag X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~9190 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=eb8fc738afe04f842c9a9f23e79fb81034932fab;p=gnome-shell.git swipe-scrolling: Take threshold into account during drag On button-release, a threshold is used to determine if the gesture should be considered a click and thus ignored. While the drag is active though, the controlled actor is dragged immediately. As a result, dragging by a tiny amount does not trigger a snap back when the action is interpreted as a click. As a fix, do not update the dragged actor's position until the same threshold is passed. https://bugzilla.gnome.org/show_bug.cgi?id=640494 --- diff --git a/js/ui/overview.js b/js/ui/overview.js index c4b0c4ec0..513d93baf 100644 --- a/js/ui/overview.js +++ b/js/ui/overview.js @@ -276,6 +276,8 @@ Overview.prototype = { _onCapturedEvent: function(actor, event) { let stageX, stageY; + let threshold = Gtk.Settings.get_default().gtk_dnd_drag_threshold; + switch(event.type()) { case Clutter.EventType.BUTTON_RELEASE: [stageX, stageY] = event.get_coords(); @@ -328,7 +330,6 @@ Overview.prototype = { // See if the user has moved the mouse enough to trigger // a drag - let threshold = Gtk.Settings.get_default().gtk_dnd_drag_threshold; if (Math.abs(stageX - this._dragStartX) < threshold && Math.abs(stageY - this._dragStartY) < threshold) { // no motion? It's a click! @@ -371,6 +372,16 @@ Overview.prototype = { let dy = this._dragY - stageY; let primary = global.get_primary_monitor(); + this._dragX = stageX; + this._dragY = stageY; + this._lastMotionTime = event.get_time(); + + // See if the user has moved the mouse enough to trigger + // a drag + if (Math.abs(stageX - this._dragStartX) < threshold && + Math.abs(stageY - this._dragStartY) < threshold) + return true; + if (this._scrollDirection == SwipeScrollDirection.HORIZONTAL) { if (St.Widget.get_default_direction() == St.TextDirection.RTL) this._scrollAdjustment.value -= (dx / primary.width) * this._scrollAdjustment.page_size; @@ -380,10 +391,6 @@ Overview.prototype = { this._scrollAdjustment.value += (dy / primary.height) * this._scrollAdjustment.page_size; } - this._dragX = stageX; - this._dragY = stageY; - this._lastMotionTime = event.get_time(); - return true; // Block enter/leave events to avoid prelights